package com.gsk.europepharma.salesReport.struts.actions;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.hibernate.Query;
import org.hibernate.Session;

import com.gsk.europepharma.salesReport.hibernate.dao.tbSpBoSRAdmMixDAO;
import com.gsk.europepharma.salesReport.hibernate.dao.tbSpBoSRAdmPdtDAO;
import com.gsk.europepharma.salesReport.hibernate.dao.tbSpBoSRAdmPrstnDAO;
import com.gsk.europepharma.salesReport.hibernate.dao.tbSpBoSRSectoDAO;
import com.gsk.europepharma.salesReport.utils.CodeLibelle;

public class ParametrageProduit extends Action {
	
	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		HttpSession sessionObject = request.getSession();
		
		// Admin  
		if (request.isUserInRole("FranceSalesReportAdmin")) {
			sessionObject.setAttribute("adminSR", "adminSR");
		} else {
			sessionObject.setAttribute("adminSR", "notAdminSR");
		}
		
		if (sessionObject.getAttribute("adminSR").toString().equals("adminSR")) {
		
			tbSpBoSRAdmPdtDAO admPdtDao;
			Session session;
			Query req;
			ArrayList result;
			Iterator iter;
			
			String lib_marche = "";
			String lib_pdt = "";
			String code_data = "";
			String cs_src = "";
			String cs_product = "";
			
			JSONArray regroupements = new JSONArray();
			JSONArray presentations = new JSONArray();
			JSONArray indicateurs = new JSONArray();
			
			String ind_pm = "N";
			String ind_dpm = "N";
			String ind_vol = "Y";
			String ind_dvol = "N";
			String ind_evol_vol = "N";
			
			int cs_adm_pdt = 0;
			
			// Debut : Recuperation des infos a partir du cs_adm_pdt
			
			if (sessionObject.getAttribute("cs_adm_pdt") != null && Integer.parseInt(sessionObject.getAttribute("cs_adm_pdt").toString()) != 0) {
				
				cs_adm_pdt = Integer.parseInt(sessionObject.getAttribute("cs_adm_pdt").toString());
				
				admPdtDao = new tbSpBoSRAdmPdtDAO();
				session = admPdtDao.getSession();
				req = session.getNamedQuery(admPdtDao.QUERY_ADM_RGPT);
				req.setInteger("cs_adm_pdt", cs_adm_pdt);
				result = new ArrayList(req.list());
				Object[] resultReq = (Object[]) result.get(0);
				sessionObject.setAttribute("cs_adm_rgpt", Integer.parseInt(resultReq[0].toString()));
				sessionObject.setAttribute("cs_adm_prstn", Integer.parseInt(resultReq[1].toString()));
				
				cs_src = resultReq[2].toString();
				lib_marche = resultReq[4].toString();
				lib_pdt = resultReq[5].toString();
				code_data = resultReq[7].toString();
				if (resultReq[12] != null) {
					cs_product = resultReq[12].toString();
				} else {
					cs_product = "0";
				}
				
				
				iter = result.iterator();
				while (iter.hasNext()) {
					Object[] tmp = (Object[]) iter.next();
					
					JSONObject regroupement = new JSONObject();
					regroupement.put("cs_adm_rgpt", tmp[0].toString());
					regroupement.put("type_rgpt", tmp[9].toString());
					if (tmp[10] != null && !tmp[10].toString().equals("")) {
						regroupement.put("code_couleur_rgpt", "#" + tmp[10].toString());
					} else {
						regroupement.put("code_couleur_rgpt", "#FF0000"); // rouge si non precise 
					}
					regroupement.put("libelle_rgpt", tmp[11].toString());
					regroupements.add(regroupement);
				}
				
				// Liste des presentations  
				admPdtDao = new tbSpBoSRAdmPdtDAO();
				session = admPdtDao.getSession();
				req = session.getNamedQuery(admPdtDao.QUERY_LISTE_PRESENTATIONS);
				req.setInteger("cs_adm_pdt", cs_adm_pdt);
				result = new ArrayList(req.list());
				iter = result.iterator();
				while (iter.hasNext()) {
					Object[] tmp = (Object[]) iter.next();
					JSONObject presentation = new JSONObject();
					presentation.put("cs_adm_prstn", Integer.parseInt(tmp[0].toString()));
					presentation.put("cs_adm_rgpt", Integer.parseInt(tmp[1].toString()));
					presentation.put("origine", tmp[2].toString());
					presentation.put("marche", tmp[3].toString());
					presentation.put("cs_prod_hier", Integer.parseInt(tmp[4].toString()));
					presentation.put("cs_presentation", Integer.parseInt(tmp[5].toString()));
					presentation.put("presentation", tmp[6].toString());
					if (tmp[7] != null) {
						presentation.put("cip", tmp[7].toString());
					} else {
						presentation.put("cip", "");
					}
					presentation.put("affect", Boolean.parseBoolean(tmp[8].toString()));
					presentations.add(presentation);
				}
				
				// Liste des indicateurs
				admPdtDao = new tbSpBoSRAdmPdtDAO();
				session = admPdtDao.getSession();
				req = session.getNamedQuery(admPdtDao.QUERY_LISTE_INDICATEURS);
				req.setInteger("cs_adm_pdt", cs_adm_pdt);
				result = new ArrayList(req.list());
				iter = result.iterator();
				while (iter.hasNext()) {
					Object[] tmp = (Object[]) iter.next();
					
					JSONObject indicateur = new JSONObject();
					indicateur.put("ind", "ind_pm");
					boolean checked = (tmp[0] != null) && (tmp[0].toString().equals("Y")); 
					indicateur.put("checked", checked);
					indicateur.put("libelle", "PM");
					indicateurs.add(indicateur);
					
					indicateur = new JSONObject();
					indicateur.put("ind", "ind_dpm");
					checked = (tmp[1] != null) && (tmp[1].toString().equals("Y")); 
					indicateur.put("checked", checked);
					indicateur.put("libelle", "&Delta;PM (pt)");
					indicateurs.add(indicateur);
					
					indicateur = new JSONObject();
					indicateur.put("ind", "ind_vol");
					checked = true; 
					indicateur.put("checked", checked);
					indicateur.put("libelle", "VOL");
					indicateurs.add(indicateur);
					
					indicateur = new JSONObject();
					indicateur.put("ind", "ind_dvol");
					checked = (tmp[3] != null) && (tmp[3].toString().equals("Y")); 
					indicateur.put("checked", checked);
					indicateur.put("libelle", "&Delta;VOL (vol)");
					indicateurs.add(indicateur);
					
					indicateur = new JSONObject();
					indicateur.put("ind", "ind_evol_vol");
					checked = (tmp[4] != null) && (tmp[4].toString().equals("Y")); 
					indicateur.put("checked", checked);
					indicateur.put("libelle", "EVOL VOL (%)");
					indicateurs.add(indicateur);
				}
				
			} else {
				
				JSONObject indicateur = new JSONObject();
				indicateur.put("ind", "ind_pm");
				indicateur.put("checked", false);
				indicateur.put("libelle", "PM");
				indicateurs.add(indicateur);
				indicateur = new JSONObject();
				indicateur.put("ind", "ind_dpm");
				indicateur.put("checked", false);
				indicateur.put("libelle", "&Delta;PM (pt)");
				indicateurs.add(indicateur);
				indicateur = new JSONObject();
				indicateur.put("ind", "ind_vol");
				indicateur.put("checked", true);
				indicateur.put("libelle", "VOL");
				indicateurs.add(indicateur);
				indicateur = new JSONObject();
				indicateur.put("ind", "ind_dvol");
				indicateur.put("checked", false);
				indicateur.put("libelle", "&Delta;VOL (vol)");
				indicateurs.add(indicateur);
				indicateur = new JSONObject();
				indicateur.put("ind", "ind_evol_vol");
				indicateur.put("checked", false);
				indicateur.put("libelle", "EVOL VOL (%)");
				indicateurs.add(indicateur);
				
			}
			
			// Fin : Recuperation des infos a partir du cs_adm_pdt
			
			// Liste des origines
			admPdtDao = new tbSpBoSRAdmPdtDAO();
			session = admPdtDao.getSession();
			req = session.getNamedQuery(tbSpBoSRAdmPdtDAO.QUERY_LISTE_ORIGINES);
			result = new ArrayList(req.list());
			iter = result.iterator();
			List<CodeLibelle> origines = new ArrayList<CodeLibelle>();
			CodeLibelle origine;
			while (iter.hasNext()) {
				Object[] tmp = (Object[]) iter.next();
				origine = new CodeLibelle();
				origine.setCode(tmp[0].toString());
				origine.setLibelle(tmp[1].toString());
				origines.add(origine);
			}
			
			// Liste des sources 
			admPdtDao = new tbSpBoSRAdmPdtDAO();
			session = admPdtDao.getSession();
			req = session.getNamedQuery(tbSpBoSRAdmPdtDAO.QUERY_LISTE_SOURCES);
			result = new ArrayList(req.list());
			iter = result.iterator();
			List<CodeLibelle> sources = new ArrayList<CodeLibelle>();
			sources.add(new CodeLibelle("-1", "---"));
			CodeLibelle source;
			while (iter.hasNext()) {
				Object[] tmp = (Object[]) iter.next();
				source = new CodeLibelle();
				source.setCode(tmp[0].toString());
				source.setLibelle(tmp[1].toString());
				sources.add(source);
			}
			
			// Liste des produits sampilot
			admPdtDao = new tbSpBoSRAdmPdtDAO();
			session = admPdtDao.getSession();
			req = session.getNamedQuery(tbSpBoSRAdmPdtDAO.QUERY_LISTE_PRODUITS_SAMPILOT);
			result = new ArrayList(req.list());
			iter = result.iterator();
			List<CodeLibelle> produits = new ArrayList<CodeLibelle>();
			produits.add(new CodeLibelle("0", "---"));
			CodeLibelle produit;
			while (iter.hasNext()) {
				Object[] tmp = (Object[]) iter.next();
				produit = new CodeLibelle();
				produit.setCode(tmp[0].toString());
				produit.setLibelle(tmp[1].toString());
				produits.add(produit);
			}
			
			// Valeurs envoyees dans l'action 
			HashMap hm = new HashMap();
	        hm.put("lib_marche", lib_marche);
	        hm.put("lib_pdt", lib_pdt);
	        hm.put("code_data", code_data);
	        hm.put("cs_src", cs_src);
	        hm.put("regroupements", regroupements);
	        hm.put("origines", origines);
	        hm.put("sources", sources);
	        hm.put("presentations", presentations);
	        
	        hm.put("produits", produits);
	        hm.put("cs_product", cs_product);
	        
	        hm.put("cs_adm_pdt", cs_adm_pdt);
	        
	        hm.put("adminSR", true);
	        
	        hm.put("indicateurs", indicateurs);
	        
	        JSONObject json = JSONObject.fromObject(hm);
	
	        response.addHeader("Content-Type", "application/json");
	        response.getOutputStream().write(json.toString().getBytes("UTF-8"));
	        response.getOutputStream().flush();
	
			return null;
			
		} else { // PAS ADMIN 
			HashMap hm = new HashMap();
			hm.put("adminSR", false);
	        JSONObject json = JSONObject.fromObject(hm);
	        response.addHeader("Content-Type", "application/json");
	        response.getOutputStream().write(json.toString().getBytes("UTF-8"));
	        response.getOutputStream().flush();
			return null;
		}
	}

}
